using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;
using CapaAccesoDatos;

namespace CapaAccesoDatos.Clases
{
    public class EstacionCAD
    {
        //-------------------------------------------------------------------------------//
        // Propiedades de la Clase.                                                      //
        //-------------------------------------------------------------------------------//
        private int id;
        private string etiqueta;
        private int idAula;
        private string notas;
        private bool disponibilidad;

        //-------------------------------------------------------------------------------//
        // Accesores publicos de la Clase.                                               //
        //-------------------------------------------------------------------------------//
        public int Id
        {
            get { return this.id; }
        }
        public string Etiqueta
        {
            get { return this.etiqueta; }
        }
        public int Id_Aula
        {
            get { return this.idAula; }
        }
        public string Notas
        {
            get { return this.notas; }
        }
        public bool Disponibilidad
        {
            get { return this.disponibilidad; }
        }

        //-------------------------------------------------------------------------------//
        // Estos son los Constructores de la Clase.                                      //
        //-------------------------------------------------------------------------------//
        private EstacionCAD(int Id, string Etiqueta, int IdAula, string Notas, bool Disponibilidad)
        {
            this.id = Id;
            this.etiqueta = Etiqueta;
            this.idAula = IdAula;
            this.notas = Notas;
            this.disponibilidad = Disponibilidad;
        }

        //-------------------------------------------------------------------------------//
        //Metodos de la interface(despreciada a favor de metodos estaticos)              //
        //-------------------------------------------------------------------------------//
        public static void Save(EstacionCAD Objeto)
        {
            String SqlCommand = "INSERT INTO " + Constantes.Tablas.Estaciones.Nombre + "(" + 
                                Constantes.Tablas.Estaciones.Campo_Etiqueta + ", " +
                                Constantes.Tablas.Estaciones.Campo_ID_Aula + ", " +
                                Constantes.Tablas.Estaciones.Campo_Notas + ", '" +
                                Constantes.Tablas.Estaciones.Campo_Disponibilidad.ToString() +
                                "') VALUES ( '" 
                                + Objeto.Etiqueta.Trim() + "', " 
                                + Objeto.Id_Aula.ToString() + ", '" 
                                + Objeto.Notas.Trim() + "')";

            //Sentencia:
            /*INSERT INTO Tabla (Columna1, Columna2...) 
             VALUES (Registro1, Registro2....); */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: EstacionesCAD.Save(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Update(EstacionCAD Objeto)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Estaciones.Nombre + " SET " +
                                Constantes.Tablas.Estaciones.Campo_Disponibilidad + "='" + Objeto.Disponibilidad.ToString() + "'" +
                                Constantes.Tablas.Estaciones.Campo_Etiqueta + "='" + Objeto.Etiqueta.Trim() + "', " +
                                Constantes.Tablas.Estaciones.Campo_ID_Aula + "=" + Objeto.Id_Aula.ToString() + ", " +
                                Constantes.Tablas.Estaciones.Campo_Notas + "='" + Objeto.Notas.Trim() + "', " + " WHERE " +
                                Constantes.Tablas.Estaciones.Campo_Id + "=" + Objeto.Id.ToString();

            //Sentencia:
            /*UPDATE Tabla SET Campo1 = Registro1, Campo2 = Registro2.... 
             WHERE Id (de la tabla) = Id; */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: EstacionesCAD.Update(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Delete(EstacionCAD Objeto)
        {
            String SqlCommand = "DELETE FROM " + Constantes.Tablas.Estaciones.Nombre + " WHERE " +
                                Constantes.Tablas.Estaciones.Campo_Id + "=" + Objeto.Id.ToString();

            //Sentencia:
            /*DELETE FROM Tabla WHERE Id (de la tabla) = Id; */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: EstacionesCAD.Delete(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }

        //-------------------------------------------------------------------------------//
        // Estos son los metodos especiales para el uso de la Capa de Lenguaje de Negocios
        //-------------------------------------------------------------------------------//
        public static EstacionCAD CrearEstacionCAD(int Id, string Etiqueta, int Id_Aula, string Notas, bool Disponibilidad)
        {
            return new EstacionCAD(Id, Etiqueta, Id_Aula, Notas, Disponibilidad);
        }

        public static EstacionCAD BuscarPorId(int Id)
        {
            EstacionCAD Retorno = null;
            String SqlCommand = " SELECT * FROM " + Constantes.Tablas.Estaciones.Nombre +
                                " WHERE " + Constantes.Tablas.Estaciones.Campo_Id +
                                " = " + Id.ToString();
            //La sentencia es
            /*
             * SELECT * FROM Estaciones WHERE Id = :P1
             * Donde :P1 es el numero del Id!
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlDataReader Cursor = null;
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Cursor = Comando.ExecuteReader(CommandBehavior.SingleRow);

                while (Cursor.Read())
                {
                    Retorno = new EstacionCAD(Convert.ToInt32(Cursor[Constantes.Tablas.Estaciones.Campo_Id]),
                                              Convert.ToString(Cursor[Constantes.Tablas.Estaciones.Campo_Etiqueta]),
                                              Convert.ToInt32(Cursor[Constantes.Tablas.Estaciones.Campo_ID_Aula]),
                                              Convert.ToString(Cursor[Constantes.Tablas.Estaciones.Campo_Notas]),
                                              Convert.ToBoolean(Cursor[Constantes.Tablas.Estaciones.Campo_Disponibilidad])
                                             );

                }

                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: EstacionCAD.BuscarPorId(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }
    }
}
